home *** CD-ROM | disk | FTP | other *** search
- /* Generated by re2c on Fri Apr 8 11:19:32 1994 */
- #line 1 "scanner.re"
- // $Log: scanner.re,v $
- // Revision 1.5 1993/10/04 02:08:25 peter
- // *** empty log message ***
- //
- // Revision 1.4 1993/09/03 16:00:05 peter
- // *** empty log message ***
- //
- // Revision 1.3 1993/06/16 21:30:02 peter
- // convert to yacc generated parser.
- //
- // Revision 1.2 1993/05/23 14:50:28 peter
- // *** empty log message ***
- //
- // Revision 1.1 1993/05/22 14:45:21 peter
- // Initial revision
- //
-
- #include <stdlib.h>
- #include <string.h>
- #include <iostream.h>
- #include <unistd.h>
- #include "scanner.h"
- #include "parser.h"
- #include "y.tab.h"
-
- extern YYSTYPE yylval;
-
- #define BSIZE 8192
-
- #define YYCTYPE uchar
- #define YYCURSOR cursor
- #define YYLIMIT lim
- #define YYMARKER ptr
- #define YYFILL(n) {cursor = fill(cursor);}
-
- #define RETURN(i) {cur = cursor; return i;}
-
-
- Scanner::Scanner(int i) : in(i),
- bot(NULL), tok(NULL), ptr(NULL), cur(NULL), pos(NULL), lim(NULL),
- top(NULL), eof(NULL), tchar(0), tline(0), cline(1) {
- ;
- }
-
- uchar *Scanner::fill(uchar *cursor){
- if(!eof){
- uint cnt = tok - bot;
- if(cnt){
- memcpy(bot, tok, lim - tok);
- tok = bot;
- ptr -= cnt;
- cursor -= cnt;
- pos -= cnt;
- lim -= cnt;
- }
- if((top - lim) < BSIZE){
- uchar *buf = new uchar[(lim - bot) + BSIZE];
- memcpy(buf, tok, lim - tok);
- tok = buf;
- ptr = &buf[ptr - bot];
- cursor = &buf[cursor - bot];
- pos = &buf[pos - bot];
- lim = &buf[lim - bot];
- top = &lim[BSIZE];
- delete bot;
- bot = buf;
- }
- if((cnt = read(in, (char*) lim, BSIZE)) != BSIZE){
- eof = &lim[cnt]; *eof++ = '\n';
- }
- lim += cnt;
- }
- return cursor;
- }
-
- #line 85
-
-
- int Scanner::echo(ostream &out){
- uchar *cursor = cur;
- tok = cursor;
- echo:
- {
- YYCTYPE yych;
- unsigned int yyaccept;
- goto yy0;
- yy1: ++YYCURSOR;
- yy0:
- if((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
- yych = *YYCURSOR;
- if(yych == '\n') goto yy4;
- if(yych != '/') goto yy6;
- yy2: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == '*') goto yy7;
- yy3:
- #line 99
- { goto echo; }
- yy4: yych = *++YYCURSOR;
- yy5:
- #line 95
- { if(cursor == eof) RETURN(0);
- out.write(tok, cursor - tok);
- tok = pos = cursor; cline++;
- goto echo; }
- yy6: yych = *++YYCURSOR;
- goto yy3;
- yy7: yych = *++YYCURSOR;
- if(yych == '!') goto yy9;
- yy8: YYCURSOR = YYMARKER;
- switch(yyaccept){
- case 0: goto yy3;
- }
- yy9: yych = *++YYCURSOR;
- if(yych != 'r') goto yy8;
- yy10: yych = *++YYCURSOR;
- if(yych != 'e') goto yy8;
- yy11: yych = *++YYCURSOR;
- if(yych != '2') goto yy8;
- yy12: yych = *++YYCURSOR;
- if(yych != 'c') goto yy8;
- yy13: yych = *++YYCURSOR;
- yy14:
- #line 92
- { out.write(tok, &cursor[-7] - tok);
- tok = cursor;
- RETURN(1); }
- }
- #line 100
-
- }
-
-
- int Scanner::scan(){
- uchar *cursor = cur;
- uint depth;
-
- scan:
- tchar = cursor - pos;
- tline = cline;
- tok = cursor;
- {
- YYCTYPE yych;
- unsigned int yyaccept;
- goto yy15;
- yy16: ++YYCURSOR;
- yy15:
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- if(yych <= ':'){
- if(yych <= '"'){
- if(yych <= '\n'){
- if(yych <= '\b') goto yy35;
- if(yych <= '\t') goto yy31;
- goto yy33;
- } else {
- if(yych == ' ') goto yy31;
- if(yych <= '!') goto yy35;
- goto yy23;
- }
- } else {
- if(yych <= '*'){
- if(yych <= '\'') goto yy35;
- if(yych <= ')') goto yy27;
- goto yy21;
- } else {
- if(yych <= '+') goto yy28;
- if(yych == '/') goto yy19;
- goto yy35;
- }
- }
- } else {
- if(yych <= 'Z'){
- if(yych <= '='){
- if(yych == '<') goto yy35;
- goto yy27;
- } else {
- if(yych == '?') goto yy28;
- if(yych <= '@') goto yy35;
- goto yy29;
- }
- } else {
- if(yych <= '`'){
- if(yych <= '[') goto yy25;
- if(yych <= '\\') goto yy27;
- goto yy35;
- } else {
- if(yych <= 'z') goto yy29;
- if(yych <= '{') goto yy17;
- if(yych <= '|') goto yy27;
- goto yy35;
- }
- }
- }
- yy17: yych = *++YYCURSOR;
- yy18:
- #line 113
- { depth = 1;
- goto code;
- }
- yy19: yych = *++YYCURSOR;
- if(yych == '*') goto yy54;
- yy20:
- #line 132
- { RETURN(*tok); }
- yy21: yych = *++YYCURSOR;
- if(yych == '/') goto yy52;
- yy22:
- #line 134
- { yylval.op = *tok;
- RETURN(CLOSE); }
- yy23: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych != '\n') goto yy48;
- yy24:
- #line 125
- { fatal("bad string"); }
- yy25: yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych != '\n') goto yy42;
- yy26:
- #line 130
- { fatal("bad character constant"); }
- yy27: yych = *++YYCURSOR;
- goto yy20;
- yy28: yych = *++YYCURSOR;
- goto yy22;
- yy29: yych = *++YYCURSOR;
- goto yy40;
- yy30:
- #line 137
- { cur = cursor;
- yylval.symbol = Symbol::find(token());
- return ID; }
- yy31: yych = *++YYCURSOR;
- goto yy38;
- yy32:
- #line 141
- { goto scan; }
- yy33: yych = *++YYCURSOR;
- yy34:
- #line 143
- { if(cursor == eof) RETURN(0);
- pos = cursor; cline++;
- goto scan;
- }
- yy35: yych = *++YYCURSOR;
- yy36:
- #line 148
- { cerr << "unexpected character: " << *tok << endl;
- goto scan;
- }
- yy37: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- yy38: if(yych == '\t') goto yy37;
- if(yych == ' ') goto yy37;
- goto yy32;
- yy39: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- yy40: if(yych <= '@'){
- if(yych <= '/') goto yy30;
- if(yych <= '9') goto yy39;
- goto yy30;
- } else {
- if(yych <= 'Z') goto yy39;
- if(yych <= '`') goto yy30;
- if(yych <= 'z') goto yy39;
- goto yy30;
- }
- yy41: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- yy42: if(yych <= '['){
- if(yych != '\n') goto yy41;
- } else {
- if(yych <= '\\') goto yy44;
- if(yych <= ']') goto yy45;
- goto yy41;
- }
- yy43: YYCURSOR = YYMARKER;
- switch(yyaccept){
- case 0: goto yy24;
- case 1: goto yy26;
- }
- yy44: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if(yych == '\n') goto yy43;
- goto yy41;
- yy45: yych = *++YYCURSOR;
- yy46:
- #line 127
- { cur = cursor;
- yylval.regexp = ranToRE(token());
- return RANGE; }
- yy47: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- yy48: if(yych <= '!'){
- if(yych == '\n') goto yy43;
- goto yy47;
- } else {
- if(yych <= '"') goto yy50;
- if(yych != '\\') goto yy47;
- }
- yy49: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if(yych == '\n') goto yy43;
- goto yy47;
- yy50: yych = *++YYCURSOR;
- yy51:
- #line 122
- { cur = cursor;
- yylval.regexp = strToRE(token());
- return STRING; }
- yy52: yych = *++YYCURSOR;
- yy53:
- #line 119
- { tok = cursor;
- RETURN(0); }
- yy54: yych = *++YYCURSOR;
- yy55:
- #line 116
- { depth = 1;
- goto comment; }
- }
- #line 151
-
-
- code:
- {
- YYCTYPE yych;
- unsigned int yyaccept;
- goto yy56;
- yy57: ++YYCURSOR;
- yy56:
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- if(yych <= '&'){
- if(yych <= '\n'){
- if(yych <= '\t') goto yy64;
- goto yy62;
- } else {
- if(yych == '"') goto yy66;
- goto yy64;
- }
- } else {
- if(yych <= '{'){
- if(yych <= '\'') goto yy67;
- if(yych <= 'z') goto yy64;
- goto yy60;
- } else {
- if(yych != '}') goto yy64;
- }
- }
- yy58: yych = *++YYCURSOR;
- yy59:
- #line 155
- { if(--depth == 0){
- cur = cursor;
- yylval.token = new Token(token(), tline);
- return CODE;
- }
- goto code; }
- yy60: yych = *++YYCURSOR;
- yy61:
- #line 161
- { ++depth;
- goto code; }
- yy62: yych = *++YYCURSOR;
- yy63:
- #line 163
- { if(cursor == eof) fatal("missing '}'");
- pos = cursor; cline++;
- goto code;
- }
- yy64: yych = *++YYCURSOR;
- yy65:
- #line 167
- { goto code; }
- yy66: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == '\n') goto yy65;
- goto yy73;
- yy67: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yych == '\n') goto yy65;
- goto yy69;
- yy68: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- yy69: if(yych <= '&'){
- if(yych != '\n') goto yy68;
- } else {
- if(yych <= '\'') goto yy64;
- if(yych == '\\') goto yy71;
- goto yy68;
- }
- yy70: YYCURSOR = YYMARKER;
- switch(yyaccept){
- case 0: goto yy65;
- }
- yy71: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if(yych == '\n') goto yy70;
- goto yy68;
- yy72: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- yy73: if(yych <= '!'){
- if(yych == '\n') goto yy70;
- goto yy72;
- } else {
- if(yych <= '"') goto yy64;
- if(yych != '\\') goto yy72;
- }
- yy74: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if(yych == '\n') goto yy70;
- goto yy72;
- }
- #line 168
-
-
- comment:
- {
- YYCTYPE yych;
- unsigned int yyaccept;
- goto yy75;
- yy76: ++YYCURSOR;
- yy75:
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- if(yych <= ')'){
- if(yych == '\n') goto yy80;
- goto yy82;
- } else {
- if(yych <= '*') goto yy77;
- if(yych == '/') goto yy79;
- goto yy82;
- }
- yy77: yych = *++YYCURSOR;
- if(yych == '/') goto yy85;
- yy78:
- #line 182
- { goto comment; }
- yy79: yych = *++YYCURSOR;
- if(yych == '*') goto yy83;
- goto yy78;
- yy80: yych = *++YYCURSOR;
- yy81:
- #line 178
- { if(cursor == eof) RETURN(0);
- tok = pos = cursor; cline++;
- goto comment;
- }
- yy82: yych = *++YYCURSOR;
- goto yy78;
- yy83: yych = *++YYCURSOR;
- yy84:
- #line 176
- { ++depth;
- goto comment; }
- yy85: yych = *++YYCURSOR;
- yy86:
- #line 172
- { if(--depth == 0)
- goto scan;
- else
- goto comment; }
- }
- #line 183
-
- }
-
- void Scanner::fatal(char *msg){
- cerr << "line " << tline << ", column " << (tchar + 1) << ": "
- << msg << endl;
- exit(1);
- }
-